home *** CD-ROM | disk | FTP | other *** search
/ The Atari Compendium / The Atari Compendium (Toad Computers) (1994).iso / files / prgtools / gnustuff / tos / updates / update20.zoo / lib / bzero.cpp < prev    next >
Encoding:
C/C++ Source or Header  |  1992-04-19  |  2.3 KB  |  117 lines

  1.  
  2. |    new version of bcopy and memset
  3. |    uses movem to set 256 bytes blocks faster.
  4. |    Alexander Lehmann    alexlehm@iti.informatik.th-darmstadt.de
  5. |    sortof inspired by jrbs bcopy
  6. |    has to be preprocessed (int parameter in memset)
  7.  
  8.     .text
  9.     .even
  10.     .globl _bzero
  11.     .globl _lbzero
  12.     .globl _memset
  13.  
  14. |    void *memset( void *dest, int val, size_t len );
  15. |    returns dest
  16. |    two versions for 16/32 bits
  17.  
  18. _memset:
  19.     movl    sp@(4),a0    | dest
  20. #ifdef __MSHORT__
  21.     movb    sp@(9),d0    | value
  22.     movl    sp@(10),d1    | length
  23. #else
  24.     movb    sp@(11),d0    | value
  25.     movl    sp@(12),d1    | length
  26. #endif
  27.     jeq    exit        | length==0? (size_t)
  28.     jra    do_set
  29.  
  30. |    void bzero( void *dest, size_t length );
  31. |    void lbzero( void *dest, size_t length );
  32. |    return value not used (returns dest)
  33.  
  34. _bzero:
  35. _lbzero:
  36.     movl    sp@(4),a0    | dest
  37.     movl    sp@(8),d1    | length
  38.     jeq    exit        | length==0? (size_t)
  39.     clrb    d0        | value
  40.  
  41. do_set:             | a0 dest, d0.b byte, d1.l length
  42.     movel    d2,sp@-
  43.  
  44.     addl    d1,a0        | a0 points to end of area, needed for predec
  45.  
  46.     movw    a0,d2        | test for alignment
  47.     btst    #0,d2        | odd ?
  48.     jeq    even
  49.     movb    d0,a0@-     | set one byte, now we are even
  50.     subql    #1,d1
  51. even:
  52.     movb    d0,d2
  53.     lslw    #8,d0
  54.     movb    d2,d0
  55.     movw    d0,d2
  56.     swap    d2
  57.     movw    d0,d2        | d2 has byte now four times
  58.  
  59.     clrw    d0        | save length less 256
  60.     movb    d1,d0
  61.     lsrl    #8,d1        | number of 256 bytes blocks
  62.     jeq    less256
  63.     movml    d3-d7/a2-a6,sp@-    | d2 is already saved
  64.     movl    d2,d3
  65.     movl    d2,d4
  66.     movl    d2,d5
  67.     movl    d2,d6
  68.     movl    d2,d7
  69.     movl    d2,a2
  70.     movl    d2,a3
  71.     movl    d2,a4
  72.     movl    d2,a5
  73.     movl    d2,a6
  74. set256:
  75.     movml    d2-d7/a2-a6,a0@-    | set 5*44+36=256 bytes
  76.     movml    d2-d7/a2-a6,a0@-
  77.     movml    d2-d7/a2-a6,a0@-
  78.     movml    d2-d7/a2-a6,a0@-
  79.     movml    d2-d7/a2-a6,a0@-
  80.     movml    d2-d7/a2-a4,a0@-
  81.     subql    #1,d1
  82.     jne    set256            | next, please
  83.     movml    sp@+,d3-d7/a2-a6
  84. less256:            | set 16 bytes blocks
  85.     movw    d0,sp@-     | save length below 256 for last 3 bytes
  86.     lsrw    #2,d0        | number of 4 bytes blocks
  87.     jeq    less4        | less that 4 bytes left
  88.     movw    d0,d1
  89.     negw    d1
  90.     andw    #3,d1        | d1 = number of bytes below 16 (-n)&3
  91.     subqw    #1,d0
  92.     lsrw    #2,d0        | number of 16 bytes blocks minus 1, if d1==0
  93.     addw    d1,d1        | offset in code (movl two bytes)
  94.     jmp    pc@(2,d1:w)    | jmp into loop
  95. set16:
  96.     movl    d2,a0@-
  97.     movl    d2,a0@-
  98.     movl    d2,a0@-
  99.     movl    d2,a0@-
  100.     dbra    d0,set16
  101. less4:
  102.     movw    sp@+,d0
  103.     btst    #1,d0
  104.     jeq    less2
  105.     movw    d2,a0@-
  106. less2:
  107.     btst    #0,d0
  108.     jeq    none
  109.     movb    d2,a0@-
  110. none:
  111. exit_d2:
  112.     movl    sp@+,d2
  113. exit:
  114.     movl sp@(4),d0        | return dest (for memset only)
  115.     rts
  116.  
  117.